iOS页面传值 - 属性传值

第二个视图控制器如何获取第一个视图控制器的部分信息?

例如 :第二个界面中的lable显示第一个界面textField中的文本,这可以使用互属性传值进行实现。

页面间传值主要有以下几种:属性、Closure、单例、代理、通知,下面我们先来了解属性传值。

属性传值的实现思路如下:

1
2
3
4
5
6
7
1. 在B中声明一个全局属性
let testProperty :String!
2. 调用这个属性
print("testProperty")
3. 在`A`中需要传入值的地方
let b = B()
b.testProperty = "this is a property form A"

下面我们就以让第二个界面中的 lable 显示第一个界面 textField 中的文本这个功能为例,了解属性传值的具体实现。首先创建一个 RootViewController 和一个 DetailViewController,在 DetailViewController 中声明一个 textString 属性,用于接收传过来的字符串:

1
2
3
4
5
6
7
8
9
class DetailViewController: UIViewController {
var textString: String!
override func viewDidLoad() {
super.viewDidLoad()
}
}

同时创建一个 Lable 用来显示传过的字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class DetailViewController: UIViewController {
var textString: String!
override func viewDidLoad() {
super.viewDidLoad()
let frame = CGRectMake(20, 100, self.view.bounds.width-40, 100)
let label = UILabel(frame: frame)
label.backgroundColor = UIColor.whiteColor()
label.font = UIFont.systemFontOfSize(20)
label.numberOfLines = 0
label.text = self.textString
self.view.addSubview(label)
self.view.backgroundColor = UIColor.greenColor()
}
}

下面我们回到 RootViewController 中,给 RootViewController 声明一个全局属性textField

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class RootViewController: UIViewController {
var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let frame = CGRectMake(20, 100, self.view.frame.size.width-40, 40)
self.textField = UITextField(frame: frame)
self.textField.borderStyle = .RoundedRect
self.view.addSubview(self.textField)
self.view.backgroundColor = UIColor.redColor()
}
}

然后给 RootViewController 添加一个手势和一个按钮,手势用来轻触任意位置,收回键盘第一响应,按钮用来转跳到 DetailViewController 并传值:

1
2
3
4
5
6
7
8
9
10
11
let PushButton = UIButton(type: .Custom)
PushButton.frame = CGRectMake(0, 0, 120, 40)
PushButton.center = self.view.center
PushButton.setTitle("入栈显示", forState: .Normal)
PushButton.backgroundColor = UIColor.grayColor()
PushButton.titleLabel?.font = UIFont.systemFontOfSize(20)
PushButton.addTarget(self, action: #selector(RootViewController.handlePush(_:)), forControlEvents: .TouchUpInside)
self.view.addSubview(PushButton)
let tap = UITapGestureRecognizer(target: self, action: #selector(RootViewController.handleTap(_:)))
self.view.addGestureRecognizer(tap)

下面实现两个对应的方法:

1
2
3
4
5
6
7
8
9
10
11
func handlePush(sender: UIButton) {
let detailVC = DetailViewController()
detailVC.textString = textField.text //传值给DetailViewController
self.presentViewController(detailVC, animated: true) {
print("完成转跳")
} //转跳到DetailViewController
}
func handleTap(tap: UITapGestureRecognizer) {
self.textField.resignFirstResponder() //收回键盘的第一响应
}

这样我们就利用属性传值的方式,实现让第二个界面中的 lable 显示第一个界面 textField 中的文本。